package com.hyper_yang._05_juc.chap05;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 循环栅栏
 * <p>
 * 例子：组队打boss过关卡游戏。
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) {
        //parties 表示相互等待线程数量，达到这个数据就执行Runnable总任务的处理(每一关处理，例如：统计每个线程(玩家)的得分)
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> { //最后到达屏障点的线程来执行Runnable方法。
            System.out.println(Thread.currentThread().getName() + "（裁判）,所有玩家都完成该关卡，继续...");
        });

        for (int i = 1; i <= 3; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "\t" + "开始第一关");
                    Thread.sleep(new Random().nextInt(10));
                    System.out.println(Thread.currentThread().getName() + "\t" + "完成第一关");
                    cyclicBarrier.await(); //设置屏障点，第一关

                    System.out.println(Thread.currentThread().getName() + "\t" + "开始第二关");
                    Thread.sleep(new Random().nextInt(10));
                    System.out.println(Thread.currentThread().getName() + "\t" + "完成第二关");
                    cyclicBarrier.await(); //设置屏障点，第二关

                    System.out.println(Thread.currentThread().getName() + "\t" + "开始第三关");
                    Thread.sleep(new Random().nextInt(10));
                    System.out.println(Thread.currentThread().getName() + "\t" + "完成第三关");
                    cyclicBarrier.await(); //设置屏障点，第三关

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, "玩家-" + i).start();
        }
    }
}
